package com.shioirikukuri.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

/**
 * 基于服务器端配置CORS响应头的方式
 * 通过@Bean注解声明了一个CorsWebFilter的实例，该实例会在HTTP请求到达Spring MVC控制器之前进行拦截，根据配置的CORS规则添加必要的响应头。
 * CorsConfiguration对象用来定义具体的CORS策略，比如允许哪些来源、请求方法、请求头等。
 * UrlBasedCorsConfigurationSource用于将CORS配置绑定到特定的URL模式上，在这个例子中，是全局的应用于所有路径。
 *
 * @author: shioirikukuri
 * @date: 2022/3/16 16:09
 * @description:
 *
 *
 */
@Configuration
public class CorsConfig {

    // 定义一个CorsWebFilter的bean, 用于处理CORS (Cross-Origin Resource Sharing) 跨域资源共享问题
    @Bean
    public CorsWebFilter corsFilter() {
        // 创建一个基于URL的CORS配置源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());

        // 创建一个新的CORS配置对象
        CorsConfiguration config = new CorsConfiguration();

        // 设置是否允许发送Cookie信息
        config.setAllowCredentials(true);

        // 设置访问控制：允许外部域名访问
        // "*" 表示所有域都可以访问此资源
        // 在Spring MVC中，如果设置为 "*", 实际上会使用请求头部中的Origin值
        config.addAllowedOriginPattern("*");

        // 设置访问控制：允许访问的Header
        // "*" 表示允许所有的Header
        config.addAllowedHeader("*");

        // 设置访问控制：预检请求的有效期（单位：秒）
        // 即在这个时间段内，浏览器可以使用缓存的预检结果，而不需要重新发起预检请求
        config.setMaxAge(18000L); // 5 hours in seconds

        // 设置访问控制：允许请求的方法
        // "*" 表示允许所有的方法
        config.addAllowedMethod("*");

        // 注册全局的CORS配置，"/**" 表示应用到所有路径
        source.registerCorsConfiguration("/**", config);

        // 返回一个CorsWebFilter，它使用上面定义的UrlBasedCorsConfigurationSource
        return new CorsWebFilter(source);
    }
}